package com.smyx.demo;

/**
 * @author SmyxMac
 * @version 1.0.0
 * @Description 稀疏数组
 * @createTime 2023年05月09日 20:59:00
 */
public class SparseArray {
    public static void main(String[] args) {
        // 声明一个二维数组
        int[][] arr = new int[5][5];
        arr[1][2] = 1;
        arr[2][3] = 2;
        printArr(arr);
        System.out.println("======================================");
        int[][] sInts = printSparseArr(arr);
        System.out.println("======================================");
        printOriginalArr(sInts);
    }

    /***
     * 根据稀疏数组恢复原数组
     * @param sInts 稀疏数组
     * @author SmyxMac
     * @date: 2023/5/9 21:29
     * @return: void
     */
    private static void printOriginalArr(int[][] sInts) {
        int[][] originArr = new int[sInts[0][0]][sInts[0][1]];
        for (int i = 1; i < sInts.length; i++) {
            int row = sInts[i][0];
            int col = sInts[i][1];
            int val = sInts[i][2];
            originArr[row][col] = val;
        }
        printArr(originArr);
    }

    /***
     * 根据原数组获取稀疏数组并打印
     * @param arr 原数组
     * @author SmyxMac
     * @date: 2023/5/9 21:13
     * @return: void
     */
    private static int[][] printSparseArr(int[][] arr) {
        // 原数组有多少个数据
        int cnt = 0;
        for (int[] ints : arr) {
            for (int anInt : ints) {
                if (anInt > 0) {
                    cnt++;
                }
            }
        }
        // 获取原数组的行、列
        int[][] sparseArr = new int[cnt + 1][3];
        sparseArr[0][0] = arr.length;
        sparseArr[0][1] = arr[0].length;
        sparseArr[0][2] = cnt;
        // 稀疏数组的行数
        int index = 1;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] > 0) {
                    sparseArr[index][0] = i;
                    sparseArr[index][1] = j;
                    sparseArr[index][2] = arr[i][j];
                    index++;
                }
            }
        }
        printArr(sparseArr);
        return sparseArr;
    }

    /**
     * 打印二维数组
     * @param arr 二维数组
     * @author SmyxMac
     * @date: 2023/5/9 21:11
     * @return: void
     */
    private static void printArr(int[][] arr) {
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + "  ");
            }
            System.out.println();
        }
    }
}
